package com.qudian.pay.schedule.service;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.quartz.SchedulerException;
import com.qudian.pay.schedule.client.TaskService;
import com.qudian.pay.schedule.enums.StrategyTypeEnum;
import com.qudian.pay.schedule.enums.TaskRunningStatusEntum;
import com.qudian.pay.schedule.model.ScheduleDistribution;
import com.qudian.pay.schedule.model.TaskModel;

/**
 * @Description: 分布式任务调度服务类
 * @ClassName: IScheduleService
 * @author gaoxiang
 * @date 2016年7月1日 下午4:21:49
 */ 
public interface IScheduleService {
	
	/**
	 * @Description: 注册调试任务
	 * @param taskModelList
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:21:58
	 */
	void registerSchedule(List<TaskModel> taskModelList);
	
	/**
	 * @Description: 根据任务标识查询表达式
	 * @param taskTag
	 * @return ExpressModel 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:22:46
	 */
	String getExpressModelByTasktag(String taskTag);
	
	/**
	 * @Description: 向指定通道发送执行命令消息
	 * @param taskModel
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:23:04
	 */
	void sendMsg(TaskModel taskModel);
	
	/**
	 * @Description: TODO
	 * @param strategyType
	 * @return ScheduleDistribution 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:23:12
	 */
	ScheduleDistribution createDistribution(StrategyTypeEnum strategyType);
	
	/**
	 * @Description: 订阅消息
	 * @param group
	 * @param UUID
	 * @param tasks
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:24:12
	 */
	void subscribe(String group, String UUID, Map<String, TaskService> tasks);
	
	/**
	 * @Description: 开启任务调度
	 * @param distribution
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:26:34
	 */
	void startSchedule(ScheduleDistribution distribution);
	
	void stopSchedule() throws SchedulerException;
	
	/**
	 * @Description: 获取执行表达式
	 * @param taskTag
	 * @return String 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:27:07
	 */
	String queryCronExpression(String taskTag);
	
	/**
	 * @Description: 更新调度任务生存时间
	 * @param taskModels
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:27:31
	 */
	void updateExpireTime(List<TaskModel> taskModels);
	
	/**
	 * @Description: 获取所有的注册任务结点
	 * @return List<TaskModel> 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:28:04
	 */
	List<TaskModel> queryTaskModels();
	
	/**
	 * @Description: 获取有执行表达式的任务结点
	 * @return List<TaskModel> 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:28:17
	 */
	List<TaskModel> queryTaskModelsWithExp();
	
	/**
	 * @Description: 根据任务结点计算HashCode和做为客户端是否变化的标识
	 * @param taskModels
	 * @return String 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:28:33
	 */
	String getHashSum(List<TaskModel> taskModels);
	
	/**
	 * @Description: 保存执行的表达式
	 * @param taskName
	 * @param expression
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:29:02
	 */
	void saveExpression(String taskName, String expression);
	
	/**
	 * @Description: 根据标识查询任务信息
	 * @param tag
	 * @return TaskModel 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:29:33
	 */
	TaskModel getTaskByTag(String tag);
	
	/**
	 * @Description: 更新结点状态
	 * @param createSchemaKey
	 * @param complete
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:30:32
	 */
	void updateTaskModelStatus(String createSchemaKey, TaskRunningStatusEntum complete);
	
	/**
	 * @Description: 查询所有状态结点
	 * @return List<TaskModel> 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:31:11
	 */
	List<TaskModel> queryTaskStatusModels();
	
	/**
	 * @Description: 正则查询redis keys
	 * @param pattern
	 * @return Set<String> 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:30:58
	 */
	Set<String> queryKeysByPattern(String pattern);
	
	/**
	 * @Description: 检查渠道订阅者是否存活
	 * @param group
	 * @param uuid
	 * @param taskMap
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:31:47
	 */
	void checkChannelAlive(String group, String uuid, Map<String, TaskService> taskMap);
	
	/**
	 * @Description: 清除无用缓存数据
	 * @param uuid
	 * @return void 返回类型
	 * @author gaoxiang
	 * @date 2016年7月1日 下午4:33:10
	 */
	void clearCache(UUID uuid);
}
